#ifndef _OPENGLAPPFRAMEWORK_UTILS_H_
#define _OPENGLAPPFRAMEWORK_UTILS_H_

#include <string>
#include <iostream>
#include "OpenglAppFramework/inc/glm/glm.hpp"

/**
 * @brief UNIX系统下获取当前文件所在的目录名，以"/"结尾
 * 
 * @param file_macro: 填入__FILE__宏即可
 * @return 返回目录名
 */
std::string getCurFileDir(const std::string& file_macro);

/**
 * 生成h_len x w_len大小的平面（-1到1），左下角为起始点
 * 包含h*w个格子，每个格子有2个三角形
 * 平面中心为(0, 0)
 * 【注意】vtx和idx需要手动释放
 * @param h_len: z维度的长度
 * @param w_len: x维度的长度
 * @param h_grid: z维度包含多少格子
 * @param w_grid: x维度包含多少格子
 * @param vtx: 输出，返回所有的顶点
 * @param idx: 输出，返回组成各个图元的顶点的坐标
 */
void genFlatPlane(float h_len, float w_len, unsigned int h_grid, unsigned int w_grid,
    float** vtx, unsigned int* vtx_cnt, int** idx, unsigned int* idx_cnt);

std::string mat2str(const glm::mat3& m);
std::string mat2str(const glm::mat4& m);
std::string vec2str(const glm::vec3& v);

#define CHECK_OPENGL(f, l) { \
    GLenum err_no = glGetError(); \
    if(err_no != GL_NO_ERROR) { \
        std::cerr << "file: " << f << ":" << l << " err_no: " << err_no << std::endl; \
    } \
}

#define CHECK_OPENGL2(f, l, msg) { \
    GLenum err_no = glGetError(); \
    if(err_no != GL_NO_ERROR) { \
        std::cerr << "file: " << f << ":" << l << " err_no: " << err_no; \
        if(msg != nullptr) {std::cerr << " " << msg; } \
        std::cerr << std::endl; } \
}

#define NE0_PRN1(x) { \
    if((x) != 0) { \
        std::cerr << "ERROR! " << __FILE__ << ":" << __LINE__ << std::endl; \
        return -1; \
    }\
}

#endif//_OPENGLAPPFRAMEWORK_UTILS_H_
